package com.adee.design.create.factory;

/*
* 抽象工厂模式：和工厂方法模式一样，只不过在一个抽象类中有多个抽象方法，就是抽象工厂模式
* 一个具体工厂可以生产同一系列的多种产品
* */
public class AbstractFactoryTest {
    public static void main(String[] args) {
        AbstractBmwCarFactory factory = new SuvBmwCarFactory();
        IBmwCar blackCar = factory.createBlackCar();
        blackCar.test();
        IBmwCar whiteCar = factory.createWhiteCar();
        whiteCar.test();
        factory = new CommonBmwCarFactory();
        IBmwCar blackCar2 = factory.createBlackCar();
        blackCar2.test();
        IBmwCar whiteCar2 = factory.createWhiteCar();
        whiteCar2.test();
    }

    // 抽象工厂
    static abstract class AbstractBmwCarFactory {
        protected abstract IBmwCar createBlackCar(); // 生产黑色车
        protected abstract IBmwCar createWhiteCar(); // 生产白色车
    }
    // 具体工厂1（suv系列）
    static class SuvBmwCarFactory extends AbstractBmwCarFactory {

        @Override
        protected IBmwCar createBlackCar() {
            return new X7SuvBlackBmwCar();
        }

        @Override
        protected IBmwCar createWhiteCar() {
            return new X7SuvWhiteBmwCar();
        }
    }
    // 具体工厂2（轿车系列）
    static class CommonBmwCarFactory extends AbstractBmwCarFactory {

        @Override
        protected IBmwCar createBlackCar() {
            return new The7CommonBlackBmwCar();
        }

        @Override
        protected IBmwCar createWhiteCar() {
            return new The7CommonWhiteBmwCar();
        }
    }

    /*
     * 抽象产品（宝马车）
     * 类型 suv、轿车common、mpv
     * 系列 7系、5系、3系、X7、X5、X3
     * 颜色 黑色、白色、灰色
     *
     * 产品特点：只要类型、系列、颜色有一个不同，就算一个新产品，就要新建一个类
     * */
    interface IBmwCar {
        public abstract void test(); // 测试
    }

    // 具体产品suv1（黑色X7 suv）
    static class X7SuvBlackBmwCar implements IBmwCar {
        @Override
        public void test() {
            System.out.println("宝马X7 Suv 黑色测试");
        }
    }
    // 具体产品suv2（白色X7 suv）
    static class X7SuvWhiteBmwCar implements IBmwCar {
        @Override
        public void test() {
            System.out.println("宝马X7 Suv 白色测试");
        }
    }
    // 具体产品轿车1（黑色7系轿车）
    static class The7CommonBlackBmwCar implements IBmwCar {
        @Override
        public void test() {
            System.out.println("黑色7系轿车测试");
        }
    }
    // 具体产品轿车2（白色7系轿车）
    static class The7CommonWhiteBmwCar implements IBmwCar {
        @Override
        public void test() {
            System.out.println("白色7系轿车测试");
        }
    }
}

